package com.zy.design.pattern.flyweight;

import java.lang.ref.WeakReference;
import java.util.Arrays;

/**
 * @author zhaoyi
 * @date 2021/4/20 17:10
 *
 *
享元模式在 Java Integer 中的应用
        IntegerCache
享元模式在 Java String 中的应用

享元模式对 JVM 的垃圾回收并不友好。因为享元工厂类一直保存了对享元对象的引用，
这就导致享元对象在没有任何代码使用的情况下，也并不会被 JVM 垃圾回收机制自动回收掉。
因此，在某些情况下，如果对象的生命周期很短，也不会被密集使用，利用享元模式反倒可能会浪费更多的内存。
 */
public class Test {

    public static void main(String[] args) {

        /**
         *  IntegerCache 只能缓存事先指定好的整型对象，
         *  借鉴 String 的设计思路，不事先指定需要缓存哪些整型对象，
         *  而是在程序的运行过程中，当用到某个整型对象的时候，创建好放置到 IntegerCache，下次再被用到的时候，直接从 IntegerCache 中返回
         *  并且能够做到在某个对象没有任何代码使用的时候，能被 JVM 垃圾回收机制回收掉
         *
         *  弱引用回顾下 ThreadLocal
         */
        MyIntegerCache.get(1);
        MyIntegerCache.get(1);
        MyIntegerCache.get(1);


        //WarpInt 有强引用指向时 gc 不会回收
        /*WeakReference<WarpInt> warpIntWeakReference = MyIntegerCache.cache.get(1);
        WarpInt warpInt = warpIntWeakReference.get();
        System.out.println(warpInt);*/


        System.gc();
        try {
            //休眠一下，在运行的时候加上虚拟机参数-XX:+PrintGCDetails，输出gc信息，确定gc发生了。
            Thread.sleep(5000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        MyIntegerCache.get(1);






    }

}
